對資料庫有點經驗的讀者應該會心想:「資料庫有這麼多的細節,還是先看看 Datalog 語言如何吧?如果看起來沒有什麼道理而且很難寫,還要花時間繼續研究下去嗎?」
Datalog 是語法高度一致且容易學習的查詢語言,趕快來體驗看看吧。
今天來學 Datalog 是個互動式的 Datalog 教學網站 (免費且不用註冊!),可以讓學習者一邊解題目、一邊對答案的方式,在互動之中大概掌握 Datalog 查詢語言。 讀者可以連上這個網站,試著挑戰解題看看。
這邊我會先帶著讀者,很快地走訪一遍這個網站。(註1)
網站裡的第一課就先談 edn 格式。
首先,Datomic 裡的 Datalog 是用 edn 格式來撰寫,所以它跟 SQL 不同,並不是字串型態的查詢語言,而是資料結構型態的查詢語言。
那什麼是 edn 格式呢?簡單一點的話,可以把它想成是 json 的加強版本,其中,明顯的加強地方有三個:
#inst "2013-02-26"
來表示時間。就先對 edn 理解到這邊吧,其它的 edn 細節不深入了解也不妨礙學習 Datalog 。
用一個真實的 Datalog 查詢來說明 edn 格式:
[:find ?title
:where
[_ :movie/title ?title]]
在這個例子裡:
:find
和 :move/title
是keyword 資料型態?title
是符號資料型態。[_ :movie/title ?title]
裡的 []
是個向量 (vector) 的容器資料型態。這個例子,如果寫成”幾乎”等價的 SQL 的話,可以寫成:
SELECT title
FROM movie-table;
解題時,把答案寫在 Query 的框裡,並且按下 Run Query
按鈕,就可以對答案。
答案如果正確時,左上角會變綠色喔。
遇到題目解不出來時,則可以按下圖右方紅圈處的 I give up!
,看解答。
註:
以 json 來講,表示一個映射
{"name": "John"
"age": 15}
同樣子的結構,在 edn 會表示成:
{:name: "John"
:age: 15}
其中,:name 和 :age 就是 keyword 資料型態。用 keyword 這樣子專用資料型態來表示映射裡的"鍵",有讓語意更加清晰的作用。
其它資源: